package com.qixiaobao.insure.service;

import com.qixiaobao.insure.domain.Insure;
import com.qixiaobao.insure.domain.SupplyInsureInfo;
import com.qixiaobao.insure.domain.dto.InsureDTO;
import com.qixiaobao.insure.domain.dto.InsureNoRemoveTempDTO;
import com.qixiaobao.insure.domain.dto.InsureQxbOrderNoTempDTO;
import com.qixiaobao.system.domain.dto.PersonDTO;
import com.qixiaobao.system.domain.Person;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @Description 保单管理 服务层
 * @Author yangxm
 * @Date 2025/6/16 17:03
 */
public interface IInsureService {


    /**
     * @Description 查询保单列表
     * @Author yangxm
     * @Date 2025/6/16 17:04
     * @param insureDTO
     * @return java.util.List<com.qixiaobao.insure.domain.Insure>
     */
    List<Insure> selectInsureList(InsureDTO insureDTO);

    /**
     * @Description 导出保单列表
     * @Author yangxm
     * @Date 2025/6/16 17:04
     * @param insureDTO
     * @param response
     */
    void export(InsureDTO insureDTO, HttpServletResponse response);

    /**
     * @Description 获取保单费用合计
     * @Author yangxm
     * @Date 2025/6/16 17:04
     * @param insureDTO
     * @return java.math.BigDecimal
     */
    BigDecimal copeInsureFeeTotal(InsureDTO insureDTO);

    /**
     * @Description 获取保单人数合计
     * @Author yangxm
     * @Date 2025/6/16 17:04
     * @param insureDTO
     * @return java.lang.Integer
     */
    Integer insurePersonTotal(InsureDTO insureDTO);

    /**
     * @Description 获取保单人员列表
     * @Author yangxm
     * @Date 2025/6/16 17:04
     * @param personDTO
     * @return java.util.List<com.qixiaobao.nondirect.invoice.domain.domain.Person>
     */
    List<Person> personList(PersonDTO personDTO);

    /**
     * @Description 一键下载银行回单，根据筛选条件下载，供应商简称必选
     * @Author yangxm
     * @Date 2025/6/18 10:02
     * @param insureDTO
     */
    void downloadReceipt(InsureDTO insureDTO);

    /**
     * @Description 根据上传的文件，删除保单号
     * @Author yangxm
     * @Date 2025/6/18 10:44
     * @param insureNoTempDtoList
     * @return java.lang.String
     */
    String removeInsureNoByTemp(List<InsureNoRemoveTempDTO> insureNoTempDtoList);

    /**
     * @Description 根据上传的文件，删除保单文件
     * @Author yangxm
     * @Date 2025/6/18 10:44
     * @param insureNoTempDtoList
     * @return java.lang.String
     */
    String removeInsureFileByTemp(List<InsureNoRemoveTempDTO> insureNoTempDtoList);

    /**
     * @Description 解析保单号文件
     * @Author yangxm
     * @Date 2025/6/18 10:44
     * @param fileInfoId  文件ID
     * @param noPermissionSupplyIdList
     * @return java.lang.String
     */
    String analysisInsureNoFile(String fileInfoId, List<Long> noPermissionSupplyIdList);

    /**
     * @Description 导入保单号
     * @Author yangxm
     * @Date 2025/6/19 13:09
     * @param fileInfoId
     * @param noPermissionSupplyIdList
     * @return int
     */
    int uploadInsureNo(String fileInfoId, List<Long> noPermissionSupplyIdList);


    /**
     * @Description 定向下载模板  解析模板内容
     * @Author yangxm
     * @Date 2025/6/19 14:23
     * @param insureQxbOrderNoTempDTOList
     */
    InsureQxbOrderNoTempDTO analysisQxbOrderNoFile(List<InsureQxbOrderNoTempDTO> insureQxbOrderNoTempDTOList);


    /**
     * @Description 生成凭证文件
     * @Author yangxm
     * @Date 2025/6/19 15:15
     * @param insureIdList
     * @param supplyShortName
     */
    void generateCustomerInsDec(List<Long> insureIdList, String supplyShortName);

    /**
     * @Description 导入保单文件  校验保单文件名称
     * @Author yangxm
     * @Date 2025/6/19 16:02
     * @param fileNameList
     */
    Map<String, List<String>> checkUploadInsureFile(List<String> fileNameList);

    /**
     * @Description 导入保单文件
     * @Author yangxm
     * @Date 2025/6/19 16:02
     * @param files
     * @param checkFlag
     * @param coverFlag
     * @return java.lang.String
     */
    String uploadInsureFile(MultipartFile[] files, String checkFlag, String coverFlag);

    /**
     * @Description 保单号维护
     * @Author yangxm
     * @Date 2025/6/19 16:55
     * @param supplyInsureInfo
     * @return int
     */
    int operationInsureNo(SupplyInsureInfo supplyInsureInfo);

    /**
     * @Description 导入凭证文件   校验凭证文件名称
     * @Author yangxm
     * @Date 2025/6/20 9:35
     * @param fileNameList
     * @return java.util.Map<java.lang.String,java.util.List<java.lang.String>>
     */
    Map<String, List<String>> checkUploadCustomerInsDecFile(List<String> fileNameList);

    /**
     * @Description 导入凭证文件
     * @Author yangxm
     * @Date 2025/6/20 9:58
     * @param files
     * @return java.lang.String
     */
    String uploadCustomerInsDecFile(MultipartFile[] files);

    /**
     * @Description 凭证下载
     * @Author yangxm
     * @Date 2025/6/20 10:05
     * @param insureDTO
     */
    void downloadCustomerInsDecFile(InsureDTO insureDTO);

    /**
     * @Description 删除所有文件
     * @Author yangxm
     * @Date 2025/6/20 10:05
     * @param insureDTO
     * @return int
     */
    int removeAllFile(InsureDTO insureDTO);

    /**
     * @Description 一键生成凭证
     * @Author yangxm
     * @Date 2025/6/20 15:37
     * @param insureDTO
     */
    void generateCustomerInsDecFile(InsureDTO insureDTO);

    /**
     * @Description 保单存档列表
     * @Author yangxm
     * @Date 2025/7/2 11:23
     * @param insureDTO
     * @return java.util.List<com.qixiaobao.insure.domain.Insure>
     */
    List<Insure> selectFullList(InsureDTO insureDTO);

    /**
     * @Description 保单存档列表导出
     * @Author yangxm
     * @Date 2025/7/2 11:44
     * @param insureDTO
     * @param response
     */
    void fullExport(InsureDTO insureDTO, HttpServletResponse response);

    int removeOriginalInsureFile(InsureDTO insureDTO);

    /**
     * @Description 批量下载原始保单文件
     * @Author yangxm
     * @Date 2025/7/2 13:47
     * @param insureDTO
     */
    void downloadOriginalInsureFile(InsureDTO insureDTO);

    /**
     * @Description 原始保单批量上传 - 校验文件
     * @Author yangxm
     * @Date 2025/7/2 14:33
     * @param fileNameList
     * @return java.util.Map<java.lang.String,java.util.List<java.lang.String>>
     */
    Map<String, List<String>> checkUploadOriginalInsureFile(List<String> fileNameList);

    /**
     * @Description 原始保单批量上传
     * @Author yangxm
     * @Date 2025/7/2 14:33
     * @param files
     * @return java.lang.String
     */
    String uploadOriginalInsureFiles(MultipartFile[] files);
}
